
import 'package:dio/dio.dart' ;
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart' hide Response;

import '../../router/app_router.dart';
import '../const.dart';
import '../storage.dart';
import 'dio_response.dart';

class DioInterceptors extends Interceptor {
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    // EasyLoading.show(status: 'loading...');
    // 对非open的接口的请求参数全部增加userId
    // if (!options.path.contains("open")) {
    //   options.queryParameters["userId"] = "xxx";
    // }
    var info= StorageUtil().getJSON(STORAGE_USER_PROFILE_KEY);
    if(info!=null){
      //var d= UserInfoData.fromJson(info);
      // 头部添加token
      //options.headers[d.tokenName??'sail-Token'] = d.tokenValue??'';//'100e89326c1046479dfc9c43c90e5942';//
    }


    // 更多业务需求

    handler.next(options);

    // super.onRequest(options, handler);
  }

  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) async {
    // 请求成功是对数据做基本处理
    int _code= response.data['errcode'];
    if (response.statusCode == 200) {
      DioResponseCode? code= DioResponseCode.codeToStatus(_code);
      switch(code){
        case DioResponseCode.SUCCESS:
          response.data = DioResponse(errcode: DioResponseCode.SUCCESS.code, errmsg: DioResponseCode.SUCCESS.toString(), data: response.data['data']);
          break;
        case DioResponseCode.ERROR:
          break;
        case DioResponseCode.NOT_LOGIN:
          EasyLoading.showToast(DioResponseCode.NOT_LOGIN.toString(),toastPosition:EasyLoadingToastPosition.bottom );
           StorageUtil().remove(STORAGE_USER_PROFILE_KEY);
           Get.offAllNamed(AppRoutes.Login);
          break;
        case DioResponseCode.USER_NOT_AUTHO:
          EasyLoading.showToast(DioResponseCode.USER_NOT_AUTHO.toString(),toastPosition:EasyLoadingToastPosition.bottom );
          response.data = DioResponse(errcode:DioResponseCode.USER_NOT_AUTHO.code, errmsg: DioResponseCode.USER_NOT_AUTHO.toString(), data: response.data['data']);

          break;
        case DioResponseCode.USER_NOT_FOUND:
          EasyLoading.showToast(DioResponseCode.USER_NOT_FOUND.toString(),toastPosition:EasyLoadingToastPosition.bottom );
          response.data = DioResponse(errcode: DioResponseCode.USER_NOT_FOUND.code, errmsg: DioResponseCode.USER_NOT_FOUND.toString(), data: response.data['data']);
          break;
        default:
          break;
      }

    } else {
      response.data = DioResponse(errcode: _code, errmsg: response.data['errmsg'], data: null);
    }
    // EasyLoading.dismiss();
    // 对某些单独的url返回数据做特殊处理
    if (response.requestOptions.baseUrl.contains("???????")) {
      //....
    }

    // 根据公司的业务需求进行定制化处理

    // 重点
    handler.next(response);
  }

  @override
  void onError(DioError err, ErrorInterceptorHandler handler) {
    switch(err.type) {
      // 连接服务器超时
      case DioErrorType.connectTimeout:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
        }
        break;
      // 响应超时
      case DioErrorType.receiveTimeout:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
        }
        break;
      // 发送超时
      case DioErrorType.sendTimeout:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
        }
        break;
      // 请求取消
      case DioErrorType.cancel:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
        }
        break;
      // 404/503错误
      case DioErrorType.response:
        {
          // 根据自己的业务需求来设定该如何操作,可以是弹出框提示/或者做一些路由跳转处理
        }
        break;
      // other 其他错误类型
      case DioErrorType.other:
        {

        }
        break;

    }
    super.onError(err, handler);
  }
}